﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<assert.h>

//const char* my_strstr(const char* str, const char* str1)
//{
//	assert(str && str1);
//	char* cp = str;
//	char* s1 = NULL;
//	char* s2 = NULL;
//	if (*str1 == '\0')//如果str 是 空字符串那么 直接返回str1
//	{
//		return str;
//	}
//	while (*cp)//*cp 是找到 跟子字符串相同的 起点
//	{
//		s1 = cp;//重新定义 s1 使其回到cp的位置 在开始查找
//		s2 = str1;// 重新定义 s2 使其还是等于 str1 数组
//		while (*s1 == *s2 && *s1  && *s2 )//限定 s1 s2 其中有一个为\0 那么跳出循环
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')//找到就返回 当前 cp开始之后的元素
//		{
//			return cp;
//		}
//		cp++;
//	}
//	return NULL;//找不到就返回空指针
//}
//
//int main()
//{
//	char arr[] = "abcdefg";
//	char arr1[] = "bcd";
//	//strstr - 在一个字符串中 找到一个子字符串
//	//找到返回 子字符串开始 到之后的 元素
//	//没找到 返回 空指针
//	char *ret= my_strstr(arr, arr1);//在arr中找到arr1 
//	printf("%s", ret);
//	return 0;
//}

//int main()
//{
//	char arr[] = "ab.cde.f";//abc\0ef
//	char* p = "d.";//分割符 - 标记 d和.
//	//char * s =strtok(arr, p);//strtok - 把选取的字符改成\0
//	//s = strtok(NULL, p);//NULL是从\0开始寻找 找到标记并改成\0
//	//s = strtok(NULL, p);//NULL是从\0开始寻找 找到标记并改成\0
//	char* r = NULL;
//	for (r = strtok(arr, p); r != NULL; r = strtok(NULL, p))
//	{
//		printf("%s ", r);
//	}
//}

//char * strncpy1(char* dest, const char* s1,size_t sz)
//{
//	assert(dest && s1);
//	char * ret = dest;
//	while (sz--)
//	{
//		*dest++ = *s1++;
//	}
//	return ret;
//}
//char* strncat1(char* arr, const char* arr1, size_t sz)
//{
//	assert(arr && arr1);
//	char* ret = arr;
//	while (*arr)
//	{
//		*arr++;
//	}
//	while (sz--)
//	{
//		*arr++ = *arr1++;
//	}
//	return ret;
//}
//int main()
//{
//	char arr[10] = { "abc\0xxxxxx" };
//	char arr1[] = { "ab" };
//	printf("%s",strncpy1(arr, arr1, 5));//strncpy - 字符串拷贝 可限制长度 如果源数组长度不够 补\0
//	printf("%s",strncat1(arr, arr1, 5));//strncat - 字符串追加 可限制长度  如果源数组长度不够 补\0
//	//strncmp(arr, arr1, 5);//strncmp - 字符串比较 可限制长度 
//	return 0;
//}

//int strncmp1(char* a1, char* a2,size_t n)
//{
//	while (*a1 == *a2 && n)
//	{
//		if (*a1 == '\0')
//			return 0;
//		a1++;
//		a2++;
//		n--;
//	}
//	if (*a1 > *a2)
//	{
//		return 1;
//	}
//	if(*a1<*a2)
//		return -1;
//}
//
//int main()
//{
//	//strcmp 比较2个字符串大小 -逐个元素比较
//	printf("%d\n", strncmp1("abcdef", "abb",3));
//	return 0;
//}

//strcat - 字符追加
// 目标空间得有\0(从哪里开始追加) 源头字符串也要有\0(追加什么时候结束)
// 目标空间够大,目标可以修改
//不建议自己追加自己
//
//char* strcat1(char* arr, const char* p)
//{
//	char* ret = arr;
//	assert(arr && p);
//	//调到末尾
//	while (*arr != '\0')
//	{
//		arr++;
//	}
//	//拷贝数据
//	while (*arr++ = *p++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr[20] = "hello ";
//	char* p = "world";
//	//strcat(arr, p);
//	//strcat(arr, "world");
//	strcat1(arr, p);
//	printf("%s", arr); 
//	return 0;
//}

////方法1
//void strcpy1(char* arr1, char* arr)
//{
//	while (*arr1++ = *arr++)//拷贝到 \0 为假 跳出循环
//	{
//		;
//	}
//}
////方法2
//void strcpy1(char* arr1, char* arr)
//{
//	assert(arr1 && arr);
//	while (*arr1++ = *arr++)//每次赋值之后 再++ //拷贝到 \0 为假 跳出循环
//	{
//		;
//	}
//}
//方法3
//void strcpy1(char* arr1, const char * arr)//因为只是传 不能改变源字符串 所以要 把他锁住
//{
//	assert(arr1 && arr);
//	while (*arr1++ = *arr++)//每次赋值之后 再++ //拷贝到 \0 为假 跳出循环
//	{
//		;
//	}
//}
//方法4
//char * strcpy1(char* arr1, const char* arr)//因为只是传 不能改变源字符串 所以要 把他锁住
//{
//	char* ret = arr1;
//	assert(arr1 && arr);
//	while (*arr1++ = *arr++)//每次赋值之后 再++ //拷贝到 \0 为假 跳出循环
//	{
//		;
//	}
//	return ret; //返回目标空间起始地址
//}
int main()
{
	char arr[1000];
	char arr1[20];
	//char arr2[] = "abcdef";//常量字符串 - 无法改变
	gets(arr);
	//strcpy - 拷贝字符串 会把原字符串的\0也会传过去 源字符串必须包含\0
	// 目标空间 必须比 源字符串空间大 
	// 保证目标空间可以修改
	//strcpy(arr2, arr);
	printf("%s", strcpy(arr1,arr));
	return 0;
}

////方法一
////size_t strlen1(const char * arr)//count 限制 指针不能被改变
////{
////	int c = 0;
////	assert(arr != NULL);// 查询指针开始不等于空格;
////		while(*arr!='\0')
////		{
////			c++;
////			arr++;
////		}
////
////	return c;
////}
////方法二 递归
//size_t strlen1(const char * arr)
//{	
//	if (*arr != '\0')
//	return 1 + strlen(arr + 1);
//	else
//		return 0;
//}
//int main()
//{
//	char arr[100];
//	gets(arr);
//	size_t sz = strlen1(arr);
//	printf("%zd", sz);
//	return 0;
//}

//int mian()
//{
//	//strlen 是 size_t 类型 无符号整形
//	if (strlen("abc") - strlen("abcdef")>0)//即使相减为负数 无符号整形也会大于等于0
//	printf(">\n");
//	else
//		printf("<\n");
//	return 0;
//}

//int main()
//{
//	int tolower(int c); //将参数传进去的⼤写字⺟转⼩写
//	int toupper(int c); //将参数传进去的⼩写字⺟转⼤写
//	char arr[100];
//	gets(arr);
//	int i = 0;
//while(arr[i])
//{
//	if (islower(arr[i]))//判断是不是小写字母
//	{
//		arr[i] = toupper(arr[i]);
//	}
//	printf("%c", arr[i]);
//	i++;
//}
//	
//return 0;
//}

////islower 来判断参数是不是小写字母
//int main()
//{
//	int ret = islower('a');
//	printf("%d", ret);
//	return 0;
//}

